﻿using AppForm_Managers.Object_Entities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace AppForm_Managers.Views
{
    public partial class Location_Communes : Form
    {
        public Location_Communes()
        {
            InitializeComponent();
        }

        private void Location_Communes_Load(object sender, EventArgs e)
        {
            DropProvinces_DataLoad();
            GridCommunes_DataLoad();
            Controls_Reset();
            NotiLable.Text = "";
            NotiLable.Visible = false;
            ErrorProvider.Dispose();
        }

        private void Controls_Reset()
        {
            AddButton.Enabled = true;
            UpdateButton.Enabled = false;
            DeleteButton.Enabled = false;

            DropProvinces.SelectedIndex = 0;
            DropDistricts.DataSource = null;
            CommuneText.Text = "";
            CheckStatus.Checked = false;
        }

        private void GridCommunes_DataLoad()
        {
            using (ManagerEmployeesEntities db = new ManagerEmployeesEntities())
            {
                GridCommunes.DataSource = db.View_Communes.ToList();

            }
        }

        private void DropProvinces_DataLoad()
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<Province> list = new List<Province>();
                Province provTemp = new Province()
                {
                    ProvID = 0,
                    NameOfProvince = "Lựa Chọn"
                };
                list.Add(provTemp);
                list.AddRange(db.Provinces.ToList());

                DropProvinces.DataSource = list;
                DropProvinces.DisplayMember = "NameOfProvince";
                DropProvinces.ValueMember = "ProvID";
                DropProvinces.SelectedIndex = 0;
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void DropProvinces_SelectedIndexChanged(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<District> list = new List<District>();
                District temp = new District()
                                {
                                    DistID = 0,
                                    NameOfDist = "Lựa Chọn"
                                };
                list.Add(temp);

                if (DropProvinces.SelectedIndex == 0)
                {
                    DropDistricts.DataSource = list;
                    DropDistricts.DisplayMember = "NameOfDist";
                    DropDistricts.ValueMember = "DistID";
                    DropDistricts.SelectedIndex = 0;
                }
                else
                {
                    int id = Int32.Parse(DropProvinces.SelectedValue.ToString());
                    Province prv = db.Provinces.Single(p => p.ProvID == id);
                    list.AddRange(prv.Districts.ToList());

                    DropDistricts.DataSource = list;
                    DropDistricts.DisplayMember = "NameOfDist";
                    DropDistricts.ValueMember = "DistID";
                    DropDistricts.SelectedIndex = 0;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void ViewCommunes_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = false;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            List<int> listSelected = ViewCommunes.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                if (index > -1)
                {
                    UpdateButton.Enabled = true;
                    DeleteButton.Enabled = true;
                    AddButton.Enabled = false;

                    CommuneText.Text = ViewCommunes.GetRowCellValue(index, "NameOfComm").ToString();
                    CheckStatus.Checked = bool.Parse(ViewCommunes.GetRowCellValue(index, "StatusOfComm").ToString());
                    int disId = Int32.Parse(ViewCommunes.GetRowCellValue(index, "DistID").ToString());

                    District dis = db.Districts.Single(d => d.DistID == disId);

                    DropProvinces.SelectedValue = dis.ProvID;
                    DropDistricts.SelectedValue = dis.DistID;
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void AddButton_Click(object sender, EventArgs e)
        {
            NotiLable.Visible = true;
            NotiLable.Text = "";
            ErrorProvider.Dispose();

            int provId = Int32.Parse(DropProvinces.SelectedValue.ToString());
            if (provId == 0)
            {
                ErrorProvider.SetError(DropProvinces, "Bạn chưa chọn tỉnh thành");
                return;
            }
            else
                ErrorProvider.Dispose();

            int disId = Int32.Parse(DropDistricts.SelectedValue.ToString());
            if (disId == 0)
            {
                ErrorProvider.SetError(DropDistricts, "Bạn chưa chọn quận, huyện");
                return;
            }
            else
                ErrorProvider.Dispose();

            if (CommuneText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(CommuneText, "Tên xã không được để trống");
                CommuneText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            ManagerEmployeesEntities db = new ManagerEmployeesEntities();

            try
            {
                District dist = db.Districts.Single(d => d.DistID == disId);
                foreach (var item in dist.Communes)
                {
                    if (item.NameOfComm.ToLower().Equals(CommuneText.Text.Trim().ToLower()))
                    {
                        ErrorProvider.SetError(CommuneText, "Trong huyện đã có tên xã này");
                        NotiLable.Visible = true;
                        NotiLable.Text = "Trong huyện đã có tên xã này";
                        NotiLable.ForeColor = Color.OrangeRed;
                        CommuneText.Focus();
                        return;
                    }
                }
                Commune comm = new Commune()
                {
                    NameOfComm = CommuneText.Text.Trim(),
                    StatusOfComm = CheckStatus.Checked,
                    DistID = disId
                };
                db.Communes.Add(comm);
                int re = db.SaveChanges();
                if (re == 1)
                {
                    NotiLable.Text = "Thêm mới xã thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();
                    Controls_Reset();
                    GridCommunes_DataLoad();
                }
                else
                {
                    NotiLable.Text = "Hệ thống đang bận, hãy thử laị";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.OrangeRed;
                    ErrorProvider.Dispose();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                db.Dispose();
            }
        }

        private void UpdateButton_Click(object sender, EventArgs e)
        {
            List<int> listSelected = ViewCommunes.GetSelectedRows().ToList<int>();
            int index = -1;
            foreach (var item in listSelected)
            {
                if (item > -1)
                {
                    index = item;
                    break;
                }
            }
            int disId = Int32.Parse(ViewCommunes.GetRowCellValue(index, "DistID").ToString());
            int communeId = Int32.Parse(ViewCommunes.GetRowCellValue(index, "ComID").ToString());
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            District dis = db.Districts.Single(d => d.DistID == disId);
            foreach (var item in dis.Communes)
            {
                if (item.ComID != communeId && item.NameOfComm.ToLower().Equals(CommuneText.Text.Trim().ToLower()))
                {
                    NotiLable.Text = "Xã, phường đã tồn tại, hãy nhập lại.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.OrangeRed;
                    ErrorProvider.SetError(CommuneText, "Xã, phường đã tồn tại, hãy nhập lại.");
                    CommuneText.Focus();
                    GridCommunes_DataLoad();
                    return;
                }
            }
            int provId = Int32.Parse(DropProvinces.SelectedValue.ToString());
            if (provId == 0)
            {
                ErrorProvider.SetError(DropProvinces, "Bạn chưa chọn tỉnh thành");
                return;
            }
            else
                ErrorProvider.Dispose();

            int disIdd = Int32.Parse(DropDistricts.SelectedValue.ToString());
            if (disIdd == 0)
            {
                ErrorProvider.SetError(DropDistricts, "Bạn chưa chọn quận, huyện");
                return;
            }
            else
                ErrorProvider.Dispose();

            if (CommuneText.Text.Trim().Length == 0)
            {
                ErrorProvider.SetError(CommuneText, "Tên xã không được để trống");
                CommuneText.Focus();
                return;
            }
            else
                ErrorProvider.Dispose();

            try
            {
                Commune comm = db.Communes.Single(c => c.ComID == communeId);
                comm.DistID = int.Parse(DropDistricts.SelectedValue.ToString());

                comm.NameOfComm = CommuneText.Text;
                comm.StatusOfComm = CheckStatus.Checked;

                if (MessageBox.Show("Bạn có muốn thay đổi thông tin?", "Cập nhật", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Text = "Cập nhật thông tin xã, phường thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();
                    GridCommunes_DataLoad();

                    Controls_Reset();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                ErrorProvider.Dispose();
                GridCommunes_DataLoad();

                Controls_Reset();
                db.Dispose();
            }
        }

        private void DeleteButton_Click(object sender, EventArgs e)
        {
            ManagerEmployeesEntities db = new ManagerEmployeesEntities();
            try
            {
                List<int> listSelected = ViewCommunes.GetSelectedRows().ToList<int>();
                int index = -1;
                foreach (var item in listSelected)
                {
                    if (item > -1)
                    {
                        index = item;
                        break;
                    }
                }
                int comId = Int32.Parse(ViewCommunes.GetRowCellValue(index, "ComID").ToString());
                Commune comm = db.Communes.Single(c => c.ComID == comId);
                db.Communes.Remove(comm);
                if (MessageBox.Show("Bạn có muốn xóa xã, phường đã chọn?", "Xóa", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
                {
                    db.SaveChanges();

                    NotiLable.Text = "Xóa xã thành công.";
                    NotiLable.Visible = true;
                    NotiLable.ForeColor = Color.Teal;
                    ErrorProvider.Dispose();
                    GridCommunes_DataLoad();

                    Controls_Reset();
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Hệ thống đang bận, hãy thử laị", "Thông báo hệ thống", MessageBoxButtons.OK, MessageBoxIcon.Stop);
            }
            finally
            {
                ErrorProvider.Dispose();
                GridCommunes_DataLoad();

                Controls_Reset();
                db.Dispose();
            }
        }

        private void CancelsButton_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Bạn có muốn hủy bỏ thao tác và làm mới?", "Hủy bỏ thao tác và làm mới", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                Controls_Reset();
                NotiLable.Visible = false;
                NotiLable.Text = "";
                ErrorProvider.Dispose();
                DropProvinces_DataLoad();
                GridCommunes_DataLoad();
            }
        }
    }
}